treemodelsort: destroy the root only if we are removing the latest row of the level
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Thu, 25 Apr 2013 14:30:12 +0000 (16:30 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Fri, 3 May 2013 11:06:08 +0000 (13:06 +0200)
GtkIconView doesn't ref the rows of the model so we have to make sure that a
level is actually empty before destroying it.

https://bugzilla.gnome.org/show_bug.cgi?id=698846

gtk/gtktreemodelsort.c
gtk/tests/sortmodel.c

index b2046c2d8ebf1472863c3a63a08e04fde7a59a38..a3545e99b9142ed08a24d46077037314b7a6d364 100644 (file)
@@ -1061,7 +1061,7 @@ gtk_tree_model_sort_row_deleted (GtkTreeModel *s_model,
     gtk_tree_model_sort_free_level (tree_model_sort,
                                     elt->children, FALSE);
 
-  if (level->ref_count == 0)
+  if (level->ref_count == 0 && g_sequence_get_length (level->seq) == 1)
     {
       gtk_tree_model_sort_increment_stamp (tree_model_sort);
       gtk_tree_model_row_deleted (GTK_TREE_MODEL (data), path);
index 147db53aeb8384aa2ae1f6ce35dc663780dfffc3..a24f8a36307819c6cdb329ddeeeecaa4c2ef8b3c 100644 (file)
@@ -1171,6 +1171,37 @@ specific_bug_674587 (void)
   g_object_unref (m);
 }
 
+static void
+row_deleted_cb (GtkTreeModel *tree_model,
+    GtkTreePath  *path,
+    guint *count)
+{
+  *count = *count + 1;
+}
+
+static void
+specific_bug_698846 (void)
+{
+  GtkListStore *store;
+  GtkTreeModel *sorted;
+  GtkTreeIter iter;
+  guint count = 0;
+
+  g_test_bug ("698846");
+
+  store = gtk_list_store_new (1, G_TYPE_STRING);
+  sorted = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store));
+
+  gtk_list_store_insert_with_values (store, &iter, 0, 0, "a", -1);
+  gtk_list_store_insert_with_values (store, &iter, 1, 0, "b", -1);
+
+  g_signal_connect (sorted, "row-deleted", G_CALLBACK (row_deleted_cb), &count);
+
+  gtk_list_store_clear (store);
+
+  g_assert_cmpuint (count, ==, 2);
+}
+
 /* main */
 
 void
@@ -1206,5 +1237,7 @@ register_sort_model_tests (void)
                    specific_bug_364946);
   g_test_add_func ("/TreeModelSort/specific/bug-674587",
                    specific_bug_674587);
+  g_test_add_func ("/TreeModelSort/specific/bug-698846",
+                   specific_bug_698846);
 }